use std::fs;
use std::path::Path;
use std::io::Write;
use anyhow::Result;
use spider_rs::website::Website;
use spider_rs::tokio;
use spider_rs::page::Page;
use url::Url;

#[tokio::main]
async fn main() -> Result<()> {
    println!("开始爬取 Cisco ChezScheme 用户指南（完整版）...");

    // 确保 resources 目录存在
    let resources_dir = Path::new("resources");
    if !resources_dir.exists() {
        fs::create_dir_all(resources_dir)?;
        println!("创建 resources 目录");
    }

    // 创建 resources/csug 子目录用于存放所有页面
    let csug_dir = resources_dir.join("csug");
    if !csug_dir.exists() {
        fs::create_dir_all(&csug_dir)?;
        println!("创建 resources/csug 目录");
    }

    // 创建 Website 实例
    let base_url = "https://cisco.github.io/ChezScheme/csug/";
    let mut website = Website::new(base_url);

    // 配置爬虫
    website.configuration.respect_robots_txt = false;
    website.configuration.subdomains = true;
    website.configuration.tld = false;
    website.configuration.delay = 100; // 延迟100毫秒，避免请求过快
    // 注意: 项目中的 spider 0.1.0 版本不支持 max_depth 和 max_pages 配置

    // 开始爬取
    println!("正在爬取网站: {}", base_url);
    website.scrape().await;

    // 获取爬取的页面内容
    let empty_vec = vec![];
    let pages = website.get_pages().unwrap_or(&empty_vec);

    if pages.is_empty() {
        println!("未找到任何页面内容");
        return Ok(());
    }

    println!("共爬取到 {} 个页面", pages.len());

    // 保存所有页面
    let mut saved_count = 0;
    let total_pages = pages.len();
    for page in pages {
        if let Some(saved) = save_page(page, base_url, &csug_dir)? {
            saved_count += 1;
            println!("保存页面 ({}/{}): {}", saved_count, total_pages, saved);
        }
    }

    println!("爬取完成! 共保存 {} 个页面到 {}", saved_count, csug_dir.display());

    Ok(())
}

// 保存页面到文件
fn save_page(page: &Page, base_url: &str, output_dir: &Path) -> Result<Option<String>> {
    let url = page.get_url();

    // 只处理来自基础URL的页面
    if !url.starts_with(base_url) {
        return Ok(None);
    }

    // 获取相对路径作为文件名
    let parsed_url = Url::parse(url)?;
    let path = parsed_url.path();

    // 提取文件名
    let file_name = if path.ends_with('/') || path == "/" {
        "index.html".to_string()
    } else {
        Path::new(path)
            .file_name()
            .map(|f| f.to_string_lossy().to_string())
            .unwrap_or_else(|| "index.html".to_string())
    };

    // 创建文件
    let file_path = output_dir.join(&file_name);
    let mut file = fs::File::create(&file_path)?;

    // 写入HTML内容
    let html_content = page.get_html();
    file.write_all(html_content.as_bytes())?;

    Ok(Some(file_name))
}
